/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package suministros.ejb30.DAO;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import javax.sql.DataSource;
import suministros.ejb30.TO.*;
import suministros.ejb30.TO.DetalleOrdenTO;
import suministros.ejb30.entity.DetalleMovimiento;
import suministros.ejb30.entity.Movimiento;
import suministros.ejb30.entity.Orden;
import suministros.ejb30.entity.Parametros;
import suministros.ejb30.entity.Pedido;
import suministros.ejb30.TO.SubAlmacenTO;
import suministros.ejb30.entity.DetalleInventario;
import suministros.ejb30.entity.DetalleInventarioPK;
import suministros.ejb30.entity.DetalleMovimientoPK;
import suministros.ejb30.entity.DetalleOrden;
import suministros.ejb30.entity.DetalleOrdenPK;
import suministros.ejb30.entity.DetallePedidoSuministro;
import suministros.ejb30.entity.DetallePedidoSuministroPK;
import suministros.ejb30.entity.DetalleTransferencia;
import suministros.ejb30.entity.DetalleTransferenciaPK;
import suministros.ejb30.entity.Empresa;
import suministros.ejb30.entity.Inventario;
import suministros.ejb30.entity.Localidad;
import suministros.ejb30.entity.NecesidadesSumi;
import suministros.ejb30.entity.NecesidadesSumiDetalle;
import suministros.ejb30.entity.NecesidadesSumiDetallePK;
import suministros.ejb30.entity.StockAlmacen;
import suministros.ejb30.entity.StockAlmacenPK;
import suministros.ejb30.entity.Suministros;
import suministros.ejb30.entity.Tipo;
import suministros.ejb30.entity.Transferencia;
import suministros.ejb30.entity.Zona;
import suministros.ejb30.helper.Utiles_Convertir;
import suministros.ejb30.helper.Utiles_Fecha;
import javax.ejb.Stateless;
import suministros.ejb30.entity.Almacen;
import suministros.ejb30.entity.CasillaSuministro;
import suministros.ejb30.entity.GrupoSuministros;
import suministros.ejb30.entity.SubAlmacen;
import suministros.ejb30.entity.SuministroEmpresa;
import suministros.ejb30.entity.SuministroEmpresaPK;
import suministros.ejb30.entity.TipoArea;
import suministros.ejb30.entity.UnidadOrganizativa;

/**
 *
 * @author Diana
 */
@Stateless
public class SumiAdministracion implements SumiAdministracionLocal {

 @EJB
 private SumiGestionPedidoDAOLocal sumiGestionPedidoDAO;

 @PersistenceUnit(unitName="suministros-pu")
  EntityManagerFactory emf;

 EntityManager em;

  @Resource(name="jdbc/Administracion")
  DataSource dsAdministracion;

  @PostConstruct
  public void inicializaBean()
  {
    this.em = this.emf.createEntityManager();
  }

  @PreDestroy
  public void finalizaBean() {
    this.em.close();
  }//
 public List<SuministroTO> getListaSuministrosMateriaPrima() throws Exception {
    Query consulta = this.em.createNativeQuery("SELECT Suministros.ID_Suministro, Suministros.descripcion " +
            " FROM  Suministros where flag_materia_prima='1' ");

    return Utiles_Convertir.convertirToTableBeanBinding_SuministrosMateriaPrima(consulta.getResultList());

  }
  public String getId(Suministros sumi) throws Exception
  {

    String retorno = null;
    Connection cnx = null;
    try {

      cnx = this.dsAdministracion.getConnection();
      CallableStatement csLlamada = cnx.prepareCall("{? = call [dbo].[f_sumi_getcodigoSuministro](?)}");
      csLlamada.registerOutParameter(1, 12);
      csLlamada.setString(2, sumi.getCodGrupoSumi().getCodGrupoSumi());
      csLlamada.execute();
      retorno = csLlamada.getString(1);
    }
    catch (SQLException ex) {
      System.out.print(ex.getMessage());
    } finally {
      try {
        cnx.close();
      } catch (Exception ex) {
        Logger.getLogger(SumiGestionPedidoDAO.class.getName()).log(Level.SEVERE, null, ex);
      }
    }
    return retorno;
  }//
 public String getIdGrupo(GrupoSuministros sumi) throws Exception
  {

    String retorno = null;
    Connection cnx = null;
    try {

      cnx = this.dsAdministracion.getConnection();
      CallableStatement csLlamada = cnx.prepareCall("{? = call [dbo].[f_sumi_getcodigoGrupoSuministro]()}");
      csLlamada.registerOutParameter(1, 12);
      csLlamada.execute();
      retorno = csLlamada.getString(1);
    }
    catch (SQLException ex) {
      System.out.print(ex.getMessage());
    } finally {
      try {
        cnx.close();
      } catch (Exception ex) {
        Logger.getLogger(SumiGestionPedidoDAO.class.getName()).log(Level.SEVERE, null, ex);
      }
    }
    return retorno;
  }//
  public String getIdUnidad(UnidadOrganizativa unidad) throws Exception
  {

    String retorno = null;
    Connection cnx = null;
    try {

      cnx = this.dsAdministracion.getConnection();
      CallableStatement csLlamada = cnx.prepareCall("{? = call [dbo].[f_sumi_getcodigoUnidad](?,?)}");
      csLlamada.registerOutParameter(1, 12);
      csLlamada.setString(2, unidad.getCodUniDepend());
      csLlamada.setString(3, unidad.getNivel()+"");
      csLlamada.execute();
      retorno = csLlamada.getString(1);
    }
    catch (SQLException ex) {
      System.out.print(ex.getMessage());
    } finally {
      try {
        cnx.close();
      } catch (Exception ex) {
        Logger.getLogger(SumiGestionPedidoDAO.class.getName()).log(Level.SEVERE, null, ex);
      }
    }
    return retorno;
  }//

 public String insertarSuministro(Suministros sumi) throws Exception
  {
    EntityTransaction tx = this.em.getTransaction();
    String codigo = this.getId(sumi);
    tx.begin();
    try {
          sumi.setIDSuministro(codigo);
          sumi.setCodGrupoSumi(this.em.find(GrupoSuministros.class,sumi.getCodGrupoSumi().getCodGrupoSumi()));
          sumi.setTipoABC(this.em.find(Tipo.class,sumi.getTipoABC().getIdTablaTipo()));
          sumi.setTipoStock(this.em.find(Tipo.class,sumi.getTipoStock().getIdTablaTipo()));
          sumi.setTipoUnidadMedida(this.em.find(Tipo.class,sumi.getTipoUnidadMedida().getIdTablaTipo()));
          sumi.setFechaUltimoCotizacion(new Date());
          this.em.persist(sumi);

          SuministroEmpresa suem= new SuministroEmpresa("001",sumi.getIDSuministro());
          if(sumi.getPrecioMercado() !=null)
          suem.setPrecioPromedio(sumi.getPrecioMercado());
          else
          suem.setPrecioPromedio(BigDecimal.ZERO);
          suem.setStock(BigDecimal.ZERO);
          suem.setValorTotal(BigDecimal.ZERO);
          this.em.persist(suem);
          this.em.flush();
          tx.commit();

    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
    return codigo;

}
 public String insertarUnidadOrganizativa(UnidadOrganizativa unidad) throws Exception
  {
    EntityTransaction tx = this.em.getTransaction();
    String codigo = this.getIdUnidad(unidad);
    tx.begin();
    try {
          unidad.setCodUniOrganizativa(codigo);
          unidad.setCodArea(this.em.find(TipoArea.class, unidad.getCodArea().getCodArea()));
          this.em.persist(unidad);
          this.em.flush();
          tx.commit();

    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
    return codigo;

}
 public String insertarGrupoSuministro(GrupoSuministros sumi) throws Exception
  {
    EntityTransaction tx = this.em.getTransaction();
    String codigo = this.getIdGrupo(sumi);
    tx.begin();
    try {
          sumi.setCodGrupoSumi(codigo);
          sumi.setAlta(true);
          sumi.setCorrelativo(0);
          sumi.setFechaOperacion(new Date());
          sumi.setTipoSuministros(this.em.find(Tipo.class, sumi.getTipoSuministros().getIdTablaTipo()));
          sumi.setCodgrupoantecesorSumi(this.em.find(GrupoSuministros.class,sumi.getCodgrupoantecesorSumi().getCodGrupoSumi()));
          sumi.setFechaOperacion(new Date());
          this.em.persist(sumi);
          this.em.flush();
          tx.commit();

    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
    return codigo;

}
  public String administrarSuministro(Suministros sumi) throws Exception
  {
    EntityTransaction tx = this.em.getTransaction();
    tx.begin();
    try {
          Tipo t= this.em.find(Tipo.class, sumi.getTipoABC().getIdTablaTipo());
          Tipo t2= this.em.find(Tipo.class, sumi.getTipoStock().getIdTablaTipo());
          Tipo t3= this.em.find(Tipo.class, sumi.getTipoUnidadMedida().getIdTablaTipo());
          GrupoSuministros g= this.em.find(GrupoSuministros.class, sumi.getCodGrupoSumi().getCodGrupoSumi());
          sumi.setTipoABC(t);
          sumi.setTipoStock(t2);
          sumi.setTipoUnidadMedida(t3);
          sumi.setCodGrupoSumi(g);
          sumi.setFechaUltimoCotizacion(new Date());
          this.em.merge(sumi);

          SuministroEmpresaPK suem= new SuministroEmpresaPK("001",sumi.getIDSuministro());
          SuministroEmpresa semp= this.em.find(SuministroEmpresa.class,suem );
          if(sumi.getPrecioMercado() !=null)
          {
           semp.setPrecioPromedio(sumi.getPrecioMercado());
           this.em.merge(semp);
          }
          this.em.flush();
          tx.commit();

    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
    return sumi.getIDSuministro();

}

   public String administrarGrupo(GrupoSuministros grupo) throws Exception
  {
    EntityTransaction tx = this.em.getTransaction();
    tx.begin();
    try {
          Tipo t= this.em.find(Tipo.class, grupo.getTipoSuministros().getIdTablaTipo());
          GrupoSuministros g= this.em.find(GrupoSuministros.class, grupo.getCodgrupoantecesorSumi().getCodGrupoSumi());
          GrupoSuministros gsumi=this.em.find(GrupoSuministros.class, grupo.getCodGrupoSumi());
          gsumi.setTipoSuministros(t);
          gsumi.setCodgrupoantecesorSumi(g);
          gsumi.setFechaOperacion(new Date());
          gsumi .setAlta(grupo.getAlta());
          gsumi.setCorrelativo(grupo.getCorrelativo());
            gsumi.setCuenta_almacen(grupo.getCuenta_almacen());
            gsumi.setCuenta_acmd(grupo.getCuenta_acmd());
            gsumi.setCuenta_acmh(grupo.getCuenta_acmh());
            gsumi.setCuenta_actpro(grupo.getCuenta_actpro());
            gsumi.setCuenta_compra(grupo.getCuenta_compra());
            gsumi.setCuenta_credfis(grupo.getCuenta_credfis());
            gsumi.setCuenta_cta4ta(grupo.getCuenta_cta4ta());
            gsumi.setCuenta_cta721(grupo.getCuenta_cta721());
            gsumi.setCuenta_ctafona(grupo.getCuenta_ctafona());
            gsumi.setCuenta_ctaod(grupo.getCuenta_ctaod());
            gsumi.setCuenta_ctaodi(grupo.getCuenta_ctaodi());
            gsumi.setCuenta_ctaoh(grupo.getCuenta_ctaoh());
            gsumi.setCuenta_ctarec(grupo.getCuenta_ctarec());
            gsumi.setCuenta_donacion(grupo.getCuenta_donacion());
            gsumi.setCuenta_impuesto(grupo.getCuenta_impuesto());
            gsumi.setCuenta_inversion(grupo.getCuenta_inversion());
            gsumi.setCuenta_link(grupo.getCuenta_link());
            gsumi.setCuenta_materiales(grupo.getCuenta_materiales());
            gsumi.setCuenta_obra(grupo.getCuenta_obra());
            gsumi.setCuenta_otros(grupo.getCuenta_otros());
            gsumi.setCuenta_prov(grupo.getCuenta_prov());
            gsumi.setCuenta_serpro(grupo.getCuenta_serpro());
            gsumi.setCuenta_servicio(grupo.getCuenta_servicio());
            gsumi.setCuenta_transferencia(grupo.getCuenta_transferencia());
            gsumi.setCuenta_varex(grupo.getCuenta_varex());
            gsumi.setDescripciongrupo(grupo.getDescripciongrupo());
          this.em.merge(gsumi);
          this.em.flush();
          tx.commit();

    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
    return grupo.getCodGrupoSumi();

}
   public List<SuministroTO> getListaSuministrosConsultar(String codigo, int tipo,int pagActual,int pagTamanno) throws Exception {
       Query consulta=null;
       if(tipo==1){

           consulta = this.em.createNativeQuery("SELECT  s.id_suministro, s.descripcion,s.codigo_anterior, t1.descripcion_valor," +
            "g.descripcion_grupo from suministros s inner join tipo t1 on s.tipo_unidad_medida" +
            "=t1.id_tabla_tipo inner join grupo_suministros g on s.cod_grupo_sumi=g.cod_grupo_sumi order by s.descripcion"  );
       }

       if(tipo==2){
           
           consulta = this.em.createNativeQuery("SELECT  s.id_suministro, s.descripcion,s.codigo_anterior, t1.descripcion_valor," +
            "g.descripcion_grupo from suministros s inner join tipo t1 on s.tipo_unidad_medida" +
            "=t1.id_tabla_tipo inner join grupo_suministros g on s.cod_grupo_sumi=g.cod_grupo_sumi " +
            "where s.cod_grupo_sumi ='"+codigo+"' order by s.descripcion");
       }



    return Utiles_Convertir.convertirToTableBeanBinding_SuministrosConsultar(consulta.setFirstResult(pagActual*pagTamanno).setMaxResults(pagTamanno).getResultList());
  }
     public int getListaSuministrosConsultarTamaño(String codigo, int tipo) throws Exception {
       Query consulta=null;
       if(tipo==1){
           
           consulta = this.em.createNativeQuery("SELECT  s.id_suministro, s.descripcion,s.codigo_anterior, t1.descripcion_valor," +
            "g.descripcion_grupo from suministros s inner join tipo t1 on s.tipo_unidad_medida" +
            "=t1.id_tabla_tipo inner join grupo_suministros g on s.cod_grupo_sumi=g.cod_grupo_sumi "  );
       }

       if(tipo==2){
 
           consulta = this.em.createNativeQuery("SELECT  s.id_suministro, s.descripcion,s.codigo_anterior, t1.descripcion_valor," +
            "g.descripcion_grupo from suministros s inner join tipo t1 on s.tipo_unidad_medida" +
            "=t1.id_tabla_tipo inner join grupo_suministros g on s.cod_grupo_sumi=g.cod_grupo_sumi " +
            "where s.cod_grupo_sumi ='"+codigo+"'");
       }



    return consulta.getResultList().size();
  }
    public List<GrupoSuministrosTO> getListaGruposConsultar(String codigo, int tipo,int pagActual,int pagTamanno) throws Exception {
       Query consulta=null;
       if(tipo==1){
            consulta = this.em.createNativeQuery(" select gs.cod_grupo_sumi, gs.descripcion_grupo," +
                    " gs1.descripcion_grupo , t.descripcion_valor from grupo_suministros gs inner join grupo_suministros gs1 " +
                    " on gs.cod_grupo_antecesor_sumi=gs1.cod_grupo_sumi inner join tipo t on gs.tipo_suministros=t.id_tabla_tipo" +
                    " where  gs.cod_grupo_antecesor_sumi is not null order by t.descripcion_valor , gs.descripcion_grupo ");
       }
       if(tipo==2){

           consulta = this.em.createNativeQuery(" select gs.cod_grupo_sumi, gs.descripcion_grupo, " +
                    " gs1.descripcion_grupo , t.descripcion_valor from grupo_suministros gs inner join grupo_suministros gs1 " +
                    " on gs.cod_grupo_antecesor_sumi=gs1.cod_grupo_sumi inner join tipo t on gs.tipo_suministros=t.id_tabla_tipo" +
                    " where  gs.cod_grupo_antecesor_sumi is not null  and  gs.cod_grupo_antecesor_sumi ='"+codigo+"'" +
                    " order by t.descripcion_valor , gs.descripcion_grupo");
       }
       if(tipo==3){

           consulta = this.em.createNativeQuery(" select gs.cod_grupo_sumi, gs.descripcion_grupo," +
                    " gs1.descripcion_grupo , t.descripcion_valor from grupo_suministros gs inner join grupo_suministros gs1 " +
                    " on gs.cod_grupo_antecesor_sumi=gs1.cod_grupo_sumi inner join tipo t on gs.tipo_suministros=t.id_tabla_tipo" +
                    " where  gs.cod_grupo_antecesor_sumi is not null  and  gs.tipo_suministros ='"+codigo+"'" +
                    " order by t.descripcion_valor , gs.descripcion_grupo");
       }

    return Utiles_Convertir.convertirToBeanBinding_GrupoSuministrosConsultar(consulta.setFirstResult(pagActual*pagTamanno).setMaxResults(pagTamanno).getResultList());
  }
     public int getListaGruposConsultarTamaño(String codigo, int tipo) throws Exception {
       Query consulta=null;
       if(tipo==1){
            consulta = this.em.createNativeQuery(" select gs.cod_grupo_sumi, gs.descripcion_grupo," +
                    " gs1.descripcion_grupo , t.descripcion_valor from grupo_suministros gs inner join grupo_suministros gs1 " +
                    " on gs.cod_grupo_antecesor_sumi=gs1.cod_grupo_sumi inner join tipo t on gs.tipo_suministros=t.id_tabla_tipo" +
                    " where  gs.cod_grupo_antecesor_sumi is not null order by t.descripcion_valor , gs.descripcion_grupo ");
       }
       if(tipo==2){

           consulta = this.em.createNativeQuery(" select gs.cod_grupo_sumi, gs.descripcion_grupo, " +
                    " gs1.descripcion_grupo , t.descripcion_valor from grupo_suministros gs inner join grupo_suministros gs1 " +
                    " on gs.cod_grupo_antecesor_sumi=gs1.cod_grupo_sumi inner join tipo t on gs.tipo_suministros=t.id_tabla_tipo" +
                    " where  gs.cod_grupo_antecesor_sumi is not null  and  gs.cod_grupo_antecesor_sumi ='"+codigo+"'" +
                    " order by t.descripcion_valor , gs.descripcion_grupo");
       }
       if(tipo==3){

           consulta = this.em.createNativeQuery(" select gs.cod_grupo_sumi, gs.descripcion_grupo," +
                    " gs1.descripcion_grupo , t.descripcion_valor from grupo_suministros gs inner join grupo_suministros gs1 " +
                    " on gs.cod_grupo_antecesor_sumi=gs1.cod_grupo_sumi inner join tipo t on gs.tipo_suministros=t.id_tabla_tipo" +
                    " where  gs.cod_grupo_antecesor_sumi is not null  and  gs.tipo_suministros ='"+codigo+"'" +
                    " order by t.descripcion_valor , gs.descripcion_grupo");
       }

    return consulta.getResultList().size();
  }
  public List<CasillaSuministroTO> obtenerCasillasSuministro(String suministro, String empresa){
        Query consulta = this.em.createNativeQuery("select  u.ID_suministro, u.id_empresa,z.nom_zona,u.id_zona, al.descripcion," +
                "u.id_almacen, sa.descripcion, u.id_subalmacen , " +
                "a.descripcion, u.id_ambiente, p.descripcion,u.id_pabellon,e.descripcion, u.id_estante," +
                " c.descripcion, u.id_casilla from  casillaSuministro u inner join zona z" +
                " on u.id_zona=z.id_zona inner join  almacen al on u.id_almacen=al.id_almacen inner join subalmacen sa " +
                "on u.id_subalmacen=sa.id_subalmacen inner join ambiente a on u.id_ambiente= a.id_Ambiente inner join " +
                "pabellon p on u.id_pabellon = p.id_Pabellon inner join estante e on u.id_estante= e.id_Estante inner join " +
                "  casilla c on u.id_casilla=c.id_Casilla where u.id_suministro='"+suministro+"' and u.id_empresa='"+empresa+"' ");
        return Utiles_Convertir.convertirToBeanBinding_CasillaSuministro(consulta.getResultList());
  }
   public void insertarSuministroCasilla(List<CasillaSuministro> sumicasillas) throws Exception
  {
    EntityTransaction tx = this.em.getTransaction();
    tx.begin();
    try {
         for(CasillaSuministro sumi:sumicasillas){
               this.em.persist(sumi);
         }
          this.em.flush();
          tx.commit();

    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
}
   public List<UnidadOrganizativaTO> getListaUnidOrganizativasDependencias() throws Exception {
    Query consulta = this.em.createNativeQuery("SELECT cod_Uni_Organizativa, Unidad_Organizativa, cod_area, cod_Uni_Depend, nivel FROM Unidad_Organizativa where nivel<2");

    return Utiles_Convertir.convertirToBeanBinding_UnidadOrganizativa(consulta.getResultList());
  }
    public List<AreaTO> getListaAreas() throws Exception {
    Query consulta = this.em.createNativeQuery("select cod_area, desc_area from tipo_area");
    return Utiles_Convertir.convertirToBeanBinding_Area(consulta.getResultList());
  }
  public Parametros cerrarMes() throws Exception{
     EntityTransaction tx = this.em.getTransaction();
     tx.begin();
     Parametros para= new Parametros();
    try {
          para= this.em.find(Parametros.class, "SU1");
          if(para.getParam2().compareTo("12")==0){
             para.setParam1((Integer.parseInt(para.getParam1())+1)+"");
             para.setParam2("01");
          }
          else{
              String mes=(Integer.parseInt(para.getParam2())+1)+"";
              if(mes.trim().length()<2)
                  mes="0"+mes;
             para.setParam2(mes);
          }
          this.em.merge(para);
          this.em.flush();
          tx.commit();

    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
    return para;
  }
 public List<TipoTO> getListaTiposTabla(String tabla) throws Exception {
    Query consulta = this.em.createNativeQuery("select id_tabla_tipo, tabla, descripcion_campo, " +
            " codigo, descripcion_valor, cantidad from tipo where tabla='"+tabla+"'");
    return Utiles_Convertir.convertirToBeanBinding_Tipo(consulta.getResultList());
  }
  public List<TipoTablaTO> getComboTablaTipo() throws Exception {
    Query consulta = this.em.createNativeQuery("select distinct tabla from tipo");
    return Utiles_Convertir.convertirToBeanBinding_TipoTabla(consulta.getResultList());
  }
    public boolean insertarTipo(TipoTO tipoto) throws Exception
  {
    boolean estado=false;
    EntityTransaction tx = this.em.getTransaction();
    tx.begin();
    try {
          Tipo tipo=Utiles_Convertir.convertirToTipo_TipoTO(tipoto);
          this.em.persist(tipo);
          this.em.flush();
          tx.commit();
          estado=true;

    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
    return estado;
}
  public boolean eliminarTipo(TipoTO tipoto) throws Exception
  {
    boolean estado=false;
    EntityTransaction tx = this.em.getTransaction();
    tx.begin();
    try {
          Tipo tipo=this.em.find(Tipo.class, tipoto.getId_tabla_tipo());
          this.em.remove(this.em.merge(tipo));
          this.em.flush();
          tx.commit();
          estado=true;

    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
    return estado;
}
 public boolean eliminarSuministros(Suministros sumi) throws Exception
  {
    boolean estado=false;
    EntityTransaction tx = this.em.getTransaction();
    tx.begin();
    try {
          Suministros suminis= this.em.find(Suministros.class, sumi.getIDSuministro());
          this.em.remove(this.em.merge(suminis));
          this.em.flush();
          tx.commit();
          estado=true;

    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
    return estado;
}
 public String getIdZona() throws Exception
  {

    String retorno = null;
    Connection cnx = null;
    try {

      cnx = this.dsAdministracion.getConnection();
      CallableStatement csLlamada = cnx.prepareCall("{? = call [dbo].[f_sumi_getcodigoZona]()}");
      csLlamada.registerOutParameter(1, 12);
      csLlamada.execute();
      retorno = csLlamada.getString(1);
    }
    catch (SQLException ex) {
      System.out.print(ex.getMessage());
    } finally {
      try {
        cnx.close();
      } catch (Exception ex) {
        Logger.getLogger(SumiGestionPedidoDAO.class.getName()).log(Level.SEVERE, null, ex);
      }
    }
    return retorno;
  }//
  public String getIdAlmacen(String zona) throws Exception
  {

    String retorno = null;
    Connection cnx = null;
    try {

      cnx = this.dsAdministracion.getConnection();
      CallableStatement csLlamada = cnx.prepareCall("{? = call [dbo].[f_sumi_getcodigoAlmacen](?)}");
      csLlamada.registerOutParameter(1, 12);
      csLlamada.setString(2,zona );
      csLlamada.execute();
      retorno = csLlamada.getString(1);
    }
    catch (SQLException ex) {
      System.out.print(ex.getMessage());
    } finally {
      try {
        cnx.close();
      } catch (Exception ex) {
        Logger.getLogger(SumiGestionPedidoDAO.class.getName()).log(Level.SEVERE, null, ex);
      }
    }
    return retorno;
  }//
   public String getIdUbicacion(String almacen) throws Exception
  {

    String retorno = null;
    Connection cnx = null;
    try {

      cnx = this.dsAdministracion.getConnection();
      CallableStatement csLlamada = cnx.prepareCall("{? = call [dbo].[f_sumi_getcodigoUbicacion](?)}");
      csLlamada.registerOutParameter(1, 12);
      csLlamada.setString(2,almacen );
      csLlamada.execute();
      retorno = csLlamada.getString(1);
    }
    catch (SQLException ex) {
      System.out.print(ex.getMessage());
    } finally {
      try {
        cnx.close();
      } catch (Exception ex) {
        Logger.getLogger(SumiGestionPedidoDAO.class.getName()).log(Level.SEVERE, null, ex);
      }
    }
    return retorno;
  }//
   public void insertarZona(Zona zona) throws Exception
  {
    EntityTransaction tx = this.em.getTransaction();
    tx.begin();
    try {
          zona.setIdZona(this.getIdZona());
          this.em.persist(zona);

          Almacen alm= new Almacen();
          alm.setIdAlmacen(this.getIdAlmacen(zona.getIdZona()));
          alm.setIdZona(zona);
          alm.setDescripcion("ALMACEN1");
          this.em.persist(alm);

          SubAlmacen sualm= new SubAlmacen();
          sualm.setIdAlmacen(alm);
          sualm.setIdSubAlmacen(this.getIdUbicacion(alm.getIdAlmacen()));
          sualm.setDescripcion("UBICACION1");
          this.em.persist(sualm);

        
          this.em.flush();
          tx.commit();

    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
    }
    public void insertarAlmacen(Almacen alm) throws Exception
  {
    EntityTransaction tx = this.em.getTransaction();
    tx.begin();
    try {
          alm.setIdZona(this.em.find(Zona.class, alm.getIdZona().getIdZona()));
          alm.setIdAlmacen(this.getIdAlmacen(alm.getIdZona().getIdZona()));
          this.em.persist(alm);

          SubAlmacen sualm= new SubAlmacen();
          sualm.setIdAlmacen(alm);
          sualm.setIdSubAlmacen(this.getIdUbicacion(sualm.getIdAlmacen().getIdAlmacen()));
          sualm.setDescripcion("UBICACION1");
          this.em.persist(sualm);

        
          this.em.flush();
          tx.commit();

    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
   }
    public void insertarSubAlmacen(SubAlmacen sualm) throws Exception
  {
    EntityTransaction tx = this.em.getTransaction();
    tx.begin();
    try {
          sualm.setIdAlmacen(this.em.find(Almacen.class, sualm.getIdAlmacen().getIdAlmacen()));
          sualm.setIdSubAlmacen(this.getIdUbicacion(sualm.getIdAlmacen().getIdAlmacen()));
          this.em.persist(sualm);

        
          this.em.flush();
          tx.commit();

    } catch (Exception e) {
      tx.rollback();
      throw e;
    }

}
  public void modificarZona(ZonaTO zona) throws Exception
  {
    EntityTransaction tx = this.em.getTransaction();
    tx.begin();
    try {
          Zona z= new Zona();
          z= this.em.find(Zona.class, zona.getId_zona());
          z.setNomZona(zona.getNom_zona());
          this.em.merge(z);
          this.em.flush();
          tx.commit();

    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
}
   public void modificarAlmacen(AlmacenTO almacen) throws Exception
  {
    EntityTransaction tx = this.em.getTransaction();
    tx.begin();
    try {
         Almacen al= new Almacen();
          al= this.em.find(Almacen.class, almacen.getCodAlmacen());
          al.setDescripcion(almacen.getDescripcion());
          this.em.merge(al);
          this.em.flush();
          tx.commit();

    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
}
    public void modificarUbicacion(SubAlmacenTO subalmacen) throws Exception
  {
    EntityTransaction tx = this.em.getTransaction();
    tx.begin();
    try {
         SubAlmacen al= new SubAlmacen();
          al= this.em.find(SubAlmacen.class, subalmacen.getCodSubAlmacen());
          al.setDescripcion(subalmacen.getDescripcion());
          this.em.merge(al);
          this.em.flush();
          tx.commit();

    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
}
    
    public Parametros modificarParametro(Parametros para) throws Exception{
     EntityTransaction tx = this.em.getTransaction();
     Parametros param;
     tx.begin();     
     try {
          param= this.em.find(Parametros.class, para.getIdParametro());
          param.setContFamiliar(para.getContFamiliar());
          param.setDescripcion(para.getDescripcion());
          param.setFecha(para.getFecha());
          param.setParam1(para.getParam1());
          param.setParam10(para.getParam10());
          param.setParam2(para.getParam2());
          param.setParam3(para.getParam3());
          param.setParam4(para.getParam4());
          param.setParam5(para.getParam5());
          param.setParamEntero(para.getParamEntero());
          param.setParam7(para.getParam7());
          param.setParam8(para.getParam8());
          param.setParam9(para.getParam9());
          param.setParamTextoLargo(para.getParamTextoLargo());
          this.em.merge(param);

          this.em.flush();
          tx.commit();

    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
     return param;
  }


}
